/**
 * 常用正则校验
 * - mobile: 手机号码
 * - tel: 座机
 * - card: 身份证
 * - mobileCode: 6位数字验证码
 * - email: 邮箱
 * - number: 数字
 * - english: 英文
 */
export type CheckType = 'mobile' | 'tel' | 'card' | 'mobileCode' | 'pwd' | 'payPwd' | 'postal' | 'QQ' | 'email' | 'money' | 'URL' | 'IP' | 'date' | 'number' | 'english' | 'chinese' | 'lower' | 'upper' | 'HTML' | 'enOrNum' | 'carNo'
/**
 * 常用正则判断集合
 * @param {string} str - 数字字符串,或数字
 * @return {boolean} 是否通过验证 true|false
 */
export function checkStr(str: string, type: CheckType) {
  switch (type) {
    case 'mobile': // 手机号码
      return /^1[3-9|]\d{9}$/.test(str)
    case 'tel': // 座机
      return /^(0\d{2,3}-\d{7,8})(-\d{1,4})?$/.test(str)
    case 'card': // 身份证
      return /(^\d{15}$)|(^\d{18}$)|(^\d{17}([\dX])$)/i.test(str)
    case 'mobileCode': // 6位数字验证码
      return /^\d{6}$/.test(str)
    case 'pwd': // 密码以字母开头，长度在6~18之间，只能包含字母、数字和下划线
      return /^(\w){6,18}$/.test(str)
    case 'payPwd': // 支付密码 6位纯数字
      return /^\d{6}$/.test(str)
    case 'postal': // 邮政编码
      return /[1-9]\d{5}(?!\d)/.test(str)
    case 'QQ': // QQ号
      return /^[1-9]\d{4,9}$/.test(str)
    case 'email': // 邮箱
      return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(str)
    case 'money': // 金额(小数点2位)
      return /^\d*(?:\.\d{0,2})?$/.test(str)
    case 'URL': // 网址
      return /(http|ftp|https):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:/~+#]*[\w\-@?^=%&/~+#])?/.test(str)
    case 'IP': // IP
      return /((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))/.test(str)
    case 'date': // 日期时间
      return /^(\d{4})-(\d{2})-(\d{2}) (\d{2})(?::\d{2}|:(\d{2}):(\d{2}))$/.test(str) || /^(\d{4})-(\d{2})-(\d{2})$/.test(str)
    case 'number': // 数字
      return /^\d$/.test(str)
    case 'english': // 英文
      return /^[a-z]+$/i.test(str)
    case 'chinese': // 中文
      return /^[u0-\\]+$/.test(str)
    case 'lower': // 小写
      return /^[a-z]+$/.test(str)
    case 'upper': // 大写
      return /^[A-Z]+$/.test(str)
    case 'HTML': // HTML标记
      return /<(?:"[^"]*"|'[^']*'|[^'">])*>/.test(str)
    case 'enOrNum': {
      // 只能是字母或者数字
      const reg = /^[0-9a-z]*$/gi
      return reg.test(str)
    }
    case 'carNo': {
      // 是否车牌号
      // 新能源车牌
      const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z]((\d{5}[DF]$)|([DF][A-HJ-NP-Z0-9]\d{4}$))/
      // 旧车牌
      const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$/
      if (str.length === 7) return creg.test(str)
      if (str.length === 8) return xreg.test(str)
      return false
    }
    default:
      throw new Error('正则式中未匹配到输入的类型')
  }
}

/**
 * 密码验证
 * @param s 字符串或者数字
 * @param len 最小长度，默认6
 * @param maxLen 最大长度，默认20
 * @param model 0数字和英文，1数字，英文必须包含，不允许有特殊字符，2数字和字母必须包含，可以有特殊字符。
 * @returns Boolean
 */
export function isPasswordOfOther(s: string | number, _len = 6, _maxLen = 20, model = 0) {
  s = String(s)
  // 密码至少包含 数字和英文，长度6-20
  let reg = /^(?!\d+$)(?![a-z]+$)[0-9A-Z]{6,20}$/i
  // 密码包含 数字,英文,字符中的两种以上，长度6-20
  if (model === 1) {
    reg = /^(?!\d+$)(?![a-z]+$)(?![A-Z]+$)(?!([^(0-9a-zA-Z)])+$).{6,20}$/
  }

  // 至少包含数字跟字母，可以有字符
  if (model === 2) {
    reg = /(?=.*([a-z].*))(?=.*\d.*)[a-z0-9-*/+.~!@#$%^&()]{6,20}$/i
  }

  return !!s.match(reg)
}
